/**
 * @author baz
 */
package cat {
import cat.state.ICatState;

import flash.display.Sprite;

public class CatView extends Sprite implements IFrameObject {
    private static const STEP:int = 15;
    private static const MAX_JUMP_SPEED:int = 44;
    private static const GRAVITATION:int = 7;

    // Параметры прыжка
    public var jumping:Boolean;
    private var jumpStartY:Number;
    private var jumpTime:Number;

    private var state:ICatState;
    private var stateList:CatStateList;

    private var view:Cat;

    public function CatView() {
        stateList = new CatStateList(this);
        setState(CatStateList.IDLE);

        view = new Cat();
        view.sitFront();
        addChild(view);
    }

    /**
     *
     * @param stateId
     * @param params
     */
    public function setState(stateId:int, ...params):void {
        var newState:ICatState = stateList.getById(stateId);
        if (state && state == newState) return;
        state && state.cleanUp();
        state = newState;
        state.init.apply(null, params);

        // Stop jumping
        jumping = false;
    }

    public function frameHandler():void {
        state.frameHandler();
        jumping && doJump();
    }

    /**
     *
     */
    public function moveRight():void {
        view.moveRight();
        this.x += STEP;
    }

    /**
     *
     */
    public function moveLeft():void {
        view.moveLeft();
        this.x -= STEP;
    }

    /**
     *
     */
    public function moveUp():void {
        view.sitFront();
        !jumping && (this.y -= STEP);
    }

    /**
     *
     */
    public function moveDown():void {
        view.sitFront();
        !jumping && (this.y += STEP);
    }

    public function jump():void {
        if (!jumping) {
            jumping = true;
            /////////////////////////setState(CatStateList.READY);
            //jumpSpeed = MAX_JUMP_SPEED * -1;

            // В начале прыжка запоминаем Y кота для последующего расчёта Y в прыжке. Время нахождения в прыжке обнуляем
            jumpStartY = this.y;
            jumpTime = 0;
        }
    }

    public function doJump():void {
        /*
         if (jumpSpeed < 0) {
         jumpSpeed *= 1 - MAX_JUMP_SPEED / 75;
         if (jumpSpeed > -MAX_JUMP_SPEED / 5) {
         jumpSpeed *= -1;
         }
         }
         if (jumpSpeed > 0 && jumpSpeed <= MAX_JUMP_SPEED) {
         jumpSpeed *= 1 + MAX_JUMP_SPEED / 50;
         }
         */

        // Уравнение расчета Y кота во время прыжка
        this.y = jumpStartY - ((MAX_JUMP_SPEED * jumpTime) - (GRAVITATION * Math.pow(jumpTime, 2)) / 2);
        jumpTime++;

        // Так определяется что кот еще не достиг верхней точки прыжка
        // jumpTime < MAX_JUMP_SPEED / GRAVITATION)

        // Данное условие-верхняя точка прыжка кота
        // jumpTime == MAX_JUMP_SPEED / GRAVITATION)

        // Так определяется что кот уже преодолел верхнюю точку прыжка и двигается вниз
        // jumpTime > MAX_JUMP_SPEED / GRAVITATION)

        // Условия конца прыжка
        if (this.y >= stage.stageHeight - this.height) {
            jumping = false;
            this.y = stage.stageHeight - this.height;
        }
    }

    private function checkHijack():void {

    }
}
}